/**
 * 使用node 创建一个静态服务
 * 前端访问视频文件，能通过 stream 的方式 实现视频的拖放
 */

import http from 'http'
import fs from 'fs'

const videoPath = './test-video.mp4'
// 拿到文件信息
const stats = fs.statSync(videoPath)

console.log('文件信息');
console.log(stats);

const app = http.createServer(async (req, res) => {
  if (req.url === '/') {
    res.writeHead(200, {
      'Content-Type': 'text/html'
    })
    fs.readFile('./index.html', (err, data) => {
      res.end(data)
    })
  } else if (req.url === '/test-video.mp4') {
    let range = req.headers['range'] // bytes=0-

    console.log(range);
    if (range) {
      // 拿到所需要的range的 位置

      let rangeList = range.match(/=(\d+)-(\d+)?/)

      /**
       * 一开始 是  bytes=0- , 则rangeList
       * [
          '=0-',
          '0',
          undefined,
          index: 5,
          input: 'bytes=0-',
          groups: undefined
        ]
       */

      let start = parseInt(rangeList[1])

      // 如果存在结束位置，则使用结束的范围，如果不存在，就是用开始 位置往后取1M数据
      let end = rangeList[2] ? parseInt(rangeList[2]) : (start + 1024 * 1024)

      if (end > stats.size - 1) {
        end = stats.size - 1
      }

      console.log('start', start, 'end-->', end);

      // 重点：一定要指定HTTP状态码为206， 表示部分内容返回，并且指定返回的字节范围  以及长度，还有文件类型
      res.writeHead(206, {
        'Content-Type': 'video/mp4',
        // 需要拿到范围，以及文件的总大小-字节单位
        'Content-Range': `bytes ${start}-${end}/${stats.size}`,
        // 返回的Http字节长度
        'Content-Length': end - start + 1,
        'Accept-Ranges': 'bytes'
      })
      // 只返回range 范围内的数据
      fs.createReadStream(videoPath, {
        start,
        end
      }).pipe(res)

      console.log('rangeList', rangeList);
    } else {
      // 直接读取到文件，然后再返回，前端无法拖动 video 控件的 进度条，因为内容是整个返回的
      // fs.readFile(videoPath,(err,data) => {
      //   res.end(data)
      // })
      // 这种流式 也是一样无法拖动进度条
      fs.createReadStream(videoPath).pipe(res)
    }
  }
})


app.listen(3003, () => {
  console.log('监听 http://localhost:3003');
})